package io.github.dunwu.javacore.jdk8.stream;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * @author Benjamin Winterberg
 */
public class Streams1 {

	public static void main(String[] args) {

		List<String> stringCollection = new ArrayList<>();
		stringCollection.add("ddd2");
		stringCollection.add("aaa2");
		stringCollection.add("bbb1");
		stringCollection.add("aaa1");
		stringCollection.add("bbb3");
		stringCollection.add("ccc");
		stringCollection.add("bbb2");
		stringCollection.add("ddd1");

		// filtering
		System.out.println("[filtering]");
		stringCollection.stream().filter((s) -> s.startsWith("a")).forEach(System.out::println);
		// "aaa2", "aaa1"

		// sorting
		System.out.println("[sorting]");
		stringCollection.stream().sorted().filter((s) -> s.startsWith("a")).forEach(System.out::println);
		// "aaa1", "aaa2"

		// mapping
		System.out.println("[mapping]");
		stringCollection.stream().map(String::toUpperCase).sorted((a, b) -> b.compareTo(a))
			.forEach(System.out::println);
		// "DDD2", "DDD1", "CCC", "BBB3", "BBB2", "AAA2", "AAA1"

		// matching
		System.out.println("[matching]");
		boolean anyStartsWithA = stringCollection.stream().anyMatch((s) -> s.startsWith("a"));
		System.out.println(anyStartsWithA); // true

		boolean allStartsWithA = stringCollection.stream().allMatch((s) -> s.startsWith("a"));
		System.out.println(allStartsWithA); // false

		boolean noneStartsWithZ = stringCollection.stream().noneMatch((s) -> s.startsWith("z"));
		System.out.println(noneStartsWithZ); // true

		// counting
		System.out.println("[counting]");
		long startsWithB = stringCollection.stream().filter((s) -> s.startsWith("b")).count();
		System.out.println(startsWithB); // 3

		// reducing
		System.out.println("[reducing]");
		Optional<String> reduced = stringCollection.stream().sorted().reduce((s1, s2) -> s1 + "#" + s2);
		reduced.ifPresent(System.out::println);
		// "aaa1#aaa2#bbb1#bbb2#bbb3#ccc#ddd1#ddd2"

	}

}
